function createObj(F,...args){
  //创建一个新对象
  const obj ={}
  //修改this指向新对象并执行
  const res = F.apply(obj,[...args])
  //修改新对象的原型对象
  obj.__proto__ = F.prototype
  //判断fn的返回值，如果是引用类型则返回该结果如果是基本类型，则放回新对象，也就是实例对象
  return res instanceof Object ? res:obj
}
//创建一个对象
//将构造函数的作用域给新对象
//执行构造函数中的代码
//返回新对象
function _new(context,...args){
  if(typeof context != 'function'){
    throw 'context must be a function'
  }
  //实例对象
  let obj = new Object()
  //实例对象的 __proto__属性 指向构造函数的原生对象
  obj.__proto__ = Object.create(context.prototype)
  //apply将实例对象作为第一对象，实例对象作为函数上下文对象，
  //可以直接访问原生对象的属性，通过实例对象就可以访问到，因为this指向实例对象
  //保存返回值
  res = context.apply(obj,[...args])
  //判断是否是引用对象
  let isObject = typeof res === 'object' &&typeof res !== null
  let isFunction = typeof res === 'function'
  //判断返回值，如果是一个对象Object 那就返回该对象作为整个表达式；如果是非对象，就忽略返回值，直接返回新创建的对象
  return isObject || isFunction ? res :obj
}